ingenious.V12
Freie Datenmanipulation
System > Freie Datenmanipulation

Die „Freie Datenmanipulation“ ist eines der mächtigsten Werkzeuge von ingenious.V12. Der„Scripteditor“ bietet alle Möglichkeiten, um Scripte schnell erstellen und ausführen zu können.

Kap_5_5_2_Bild_1.jpg

Bei der Erstellung von Scripten unterscheidet man zwischen gespeicherten und automatischen Prozeduren. Der Unterschied besteht in der Anwendung und Ausführung der Scripte. Während gespeicherte Prozeduren allgemein einem Modul zugeordnet werden und dort über Listenansicht abrufbar sind, werden automatische Prozeduren an bestimmte Arbeitsschritte eines Moduls angehangen und dann automatisch ausgeführt, wenn dieser Arbeitsschritt erfolgt. Beispielsweise nach dem Öffnen eines Moduls, dem Speichern einer Funktion, der Ausführung einer Suche oder dem Druck eines Dokuments. Um automatische Prozeduren anlegen und bearbeiten zu können, muss zunächst das entsprechende Benutzerrecht freigeschaltet werden.

Kap_5_5_2_Bild_2.jpg

Die folgenden Übungen werden anhand von Beispielscripten gespeicherter Prozeduren dargestellt. Die Anwendung der automatischen Prozeduren ist analog.

 

Übung zum Erstellen von Scripten

1.   Klicken Sie in der Symbolleiste auf die Schaltfläche Kap_5_5_2_Bild_2.jpg um ein neues Script zu erstellen.

2.   Als nächstes geben Sie dem Script einen Methodennamen.

Kap_5_5_2_Bild_3.jpg

Fenster um Script zu benennen

3.   Erstellen Sie Ihr Script im Scriptbereich.

 

CW_SetPrefs 

CW_SetDate (Current date(*)) 

CW_OpenDialog

If (OK=1)

QUERY([Projekte];[Projekte]Gedruckt am=cwSelectDate) 

End if

 

Im dargestellten Beispiel sehen Sie nähere Erläuterungen zu den Scriptbefehl, welche mit //# eröffnet werden und bei der Scriptausführung keine Berücksichtigung finden.

Kap_5_5_2_Bild_4.jpg

Sie können Scripte entweder mit der Tastatureingabe oder mit Mausklicks auf Schlüsselwörter, Adressen und Befehle zusammenstellen.

4.   Sichern Sie Ihr Script mit der Schaltfläche Kap_5_5_2_Bild_5.jpg, bevor Sie es zum ersten Mal ausführen.

5.   Um später das Script zu starten, genügt ein Klick auf die Schaltfläche Kap_5_5_2_Bild_6.jpg.

Scripte, die Daten verändern (Datensätze löschen, erstellen, aktualisieren), werden von ingenious.V12 automatisch erkannt und ihre Ausführung nur mit einem Sicherheitsschlüssel erlaubt. Diesen einmaligen Freigabecode bekommen Sie nach Prüfung des Scripts durch die Ingenious GmbH mitgeteilt. Achten Sie darauf, dass nur Personen mit genügend Fachwissen Scripte erstellen und ausführen.

Warnhinweis: Scripte ermöglichen den Zugriff auf interne Daten außerhalb der ingenious.V12 Benutzerrechte.

Weiterhin ist es möglich, die Scripte bestimmten Modulen zuzuweisen. Somit können dann nur noch Personen, welche auch die entsprechenden Modulrechte besitzen, die Scripte ausführen.

In dem Fall, dass ein Scriptinhalt einmal fehlerhaft, oder unvollständig ist, erscheint folgende Fehlermeldung. Sie können die Prozedur daraufhin abbrechen und den Fehler ausbessern:

Kap_5_5_2_Bild_32.jpg

 

Übung zum Zuweisen von Scripten

1.   Markieren Sie den Script „Test 1“ und wählen Sie das Menü „Script/Scriptzuordnung“.

Kap_5_5_2_Bild_7.jpg

2.   Weisen Sie dem Script per Drag & Drop die gewünschten Module zu und klicken Sie auf die Schaltfläche „OK“.

Kap_5_5_2_Bild_8.jpg

Die Scripte stehen nun jedem mit dem entsprechenden Modulrecht zu. Die Rechtvergabe dazu erfolgt in der Registerkarte „Benutzerrechte“ der Benutzerverwaltung.

Kap_5_5_2_Bild_9.jpg

Dem autorisierten Benutzer steht in der Listenansicht des Moduls ein neuer Ordner „Scripte“ zur Verfügung. Hier findet er alle ihm zur Verfügung stehenden Scripte. Die Ausführung erfolgt nur durch das Anklicken des Scripts. Um ein Script von der Ingenious GmbH prüfen zu lassen, muss es zuerst exportiert werden.

Kap_5_5_2_Bild_10.jpg

Achtung: Bei der Zuweisung von Scripten automatischer Prozeduren können Sie festlegen, bei welchen Arbeitsschritt das Script automatisch ausgeführt werden soll.

Kap_5_5_2_Bild_12.jpg

 

Übung zum Exportieren von Scripten

1.   In der Freien Datenmanipulation exportieren Sie mit einem Klick auf die Schaltfläche Kap_5_5_2_Bild_11.jpg das Script in eine Textdatei.

Es folgt das Windows-Standardfenster um Dateien abzuspeichern.

2.   Geben Sie der Exportdatei einen Namen und setzen Sie die Prozedur mit der Schaltfläche „Speichern“ in Gang.

Wenn Sie die Datei gespeichert haben, finden Sie jetzt ein entsprechendes Icon.

Kap_5_5_2_Bild_12.jpg

Um einen Sicherheitsschlüssel für dieses Script zu bekommen, schicken Sie diese Datei zur Ingenious GmbH. Wurde Ihr Script korrigiert, bekommen Sie eine neue Textdatei (Neues Script) und eine zweite Datei mit dem Sicherheitsschlüssel zugeschickt.

 

Übung zum Importieren von Scripten

1.   Klicken Sie auf die Schaltfläche Kap_5_5_2_Bild_13.jpg und öffnen Sie die gewünschte Datei im Windowsdialogfenster.

Falls die Datei einen Sicherheitsschlüssel besitzt, müssen Sie diesen in das entsprechende Feld eintragen/kopieren und auf die Schaltfläche Kap_5_5_2_Bild_15.jpg klicken.

Kap_5_5_2_Bild_14.jpg

Um das Script nochmals auszuführen, benötigen Sie wieder einen neuen Sicherheitsschlüssel.

Achtung: Da diese Scripte nur mit internen Kenntnissen über Zusammenhänge in komplexen Datenbanksystemen erstellt werden können, sollten nur qualifizierte Personen Zugang zu diesem Modul bekommen. Aber natürlich stehen Ihnen auch hier die Mitarbeiter der Ingenious GmbH bei der Erstellung von individuellen Scripten gern zur Verfügung.

Über den Menüpunkt Script à Scrpitordner importieren und à Scriptordner exportieren, können ganze Ordner geladen oder ausgegeben werden:

 

Kap_5_5_2_Bild_31.jpg

 

Excec_Script

Exec_Script ist ein externer Befehl zur Ausführung von Scripten an beliebigen Stellen, die 4D Code erlauben, beispielsweise Write- und View-Dokumente. Exec_Script kann jedoch auch direkt als Platzhalter {Exec_Script("Scriptname";"Param1";"Param_N")} verwendet werden. Auf diese Weise lassen sich Textbausteine und Scripte dynamisch zusammensetzen, was die Flexibilität von ingenious.V12 steigert.

Wichtig: Innerhalb des Scriptes muss der Ausgabebefehl "Result=" verwendet werden. Zur Veranschaulichung folgt eine kurze Übung:

 

1.   Öffnen Sie die Freie Datenmanipulation und legen Sie bei den automatischen Prozeduren ein neues Script "TestWrite" mit dem Inhalt "Result:="Gespeicherte Projekte: "+String(records in table([Projekte]))" an. Anhand dieses Scriptes soll die Anzahl der gespeicherten Projekte in Ingenious.V12 ausgegeben werden.

Kap_5_5_2_Bild_18.jpg

 

Variante 1 als 4D Ausdruck

2.   Wechseln Sie nun in die Textbausteinverwaltung und legen Sie im Bereich "Freie Texte" einen neuen Textbaustein "Test" an.

Kap_5_5_2_Bild_19.jpg

3.   Wählen Sie im Menü "Einfügen" die Option "4D Ausdruck...". Im erscheinenden Fenster gehen Sie auf die Registerkarte "Ausdruck" und klicken auf den Button "Bearbeiten...".

Kap_5_5_2_Bild_20.jpg

4.   Es öffnet sich der Formeleditor. Geben Sie im oberen Bereich den Befehl "EXEC_Script("TestWrite")" ein und bestätigen Sie Ihre Eingabe mit "OK".

Kap_5_5_2_Bild_21.jpg

5.   Im 4D Ausdruck-Fenster wird nun der angelegte Befehl angezeigt. Klicken Sie auf "Ok", um ihn in den Textbaustein einzufügen.

Kap_5_5_2_Bild_22.jpg

Kap_5_5_2_Bild_23.jpg

6.   Klicken Sie nun im Menü "Anzeigen" auf die Option "Referenzen", wird das von Ihnen angelegte Script ausgeführt.

Kap_5_5_2_Bild_24.jpg

 

Variante 2 als Platzhalter

2.   Legen Sie in der Textbausteinverwaltung im Bereich "Projektvorlagen" eine neue Vorlage "Test2" an.

Kap_5_5_2_Bild_25.jpg

3.   Tragen Sie nun den Platzhalter "{Exec_Script("TestWrite")}" ein, speichern und verlassen Sie die Textbausteinverwaltung.

Kap_5_5_2_Bild_26.jpg

In der Druckvorschau der Projektvorlage wird der Platzhalter aufgelöst.

Kap_5_5_2_Bild_27.jpg

 

Benutzerdefinierte Listen

Benutzerdefinierte Listen (Sidebars) sind flexibel konfigurierbare Steuerelemente zur schnelleren Eingabe verschiedener Felder in die Detailansicht der jeweiligen Modulen.  Das Anlegen benutzerdefinierter Listen ist im Kontakte-Modul, den Workflow-Modulen und bei den Artikeln möglich.

Achtung: Um die benutzerdefinierten Listen im Kontakte-Modul nutzen zu können, müssen Sie zunächst die entsprechenden Benutzerrechte freischalten. Bei den anderen Modulen benötigen Sie zu diesem Zweck kein gesondertes Benutzerrecht.

Kap_5_5_2_Bild_28.jpg

Erstellen Sie einfach in der Freien Datenmanipulation unter der Rubrik "Automatische Prozeduren" das entsprechende Script und ordnen Sie es dem gewünschten Modul zu. Bei der Erstellung individueller Scripte stehen Ihnen natürlich auch die Mitarbeiter der Ingenious GmbH gern zur Verfügung.

Folgende Parameter/Werte sind möglich:

Parameter

Werte

Anmerkungen

LINES

Ganzzahl

Bsp. "10"

Die Anzahl der Ausgabezeile der Tabelle.

Dient zur Initialisierung und muss vor allen anderen Befehlen ausgeführt werden.

"Zeile" kann leer sein/wird nicht benötigt.

_WIDTH

Ganzzahl

Bsp. "300"

Breite der Tabelle in Pixel, wenn nicht angegeben: Defaultwert von 300.

"Zeile" kann leer sein/wird nicht benötigt.

_SPLIT

Zahl; Zahl

Bsp. "15;20"

Aufteilung der Spalten im Verhältnis von Zahl1 zu Zahl2

"Zeile" kann leer sein/wird nicht benötigt.

NAME

Text

Bsp. "Firma/Name"

Bezeichnung der aktuellen Zeile (linke Spalte)

FORECOLOR

Farbe oder

RGB (Zahl1,Zahl2,Zahl3)

Bsp. "RGB(120,220,170)"

Einfärbung des Textes in der linken Spalte (Bezeichnung) Verfügbare Farben: red, green, blue, white, black, yellow oder RGB-Werte

BACKCOLOR

Farbe oder

RGB (Zahl1,Zahl2,Zahl3)

Bsp. "red"

Einfärbung des Textes in der linken Spalte (Bezeichnung) Verfügbare Farben: red, green, blue, white, black, yellow oder RGB-Werte

BIND

Feld in der Datenbank

Bsp. "[Kontakte]Name"

Angezeigter/Änderbarer Wert (rechte Spalte)

In der 1. Version der UserList kann nur die Tabelle [Kontakte] verwendet werden. Die Anbindung an eine generische Tabelle mit beliebig vielen frei definierbaren Feldern ist vorgesehen.

Wird kein Bind angegeben, wird ein angebundenes Script beim Laden der Tabelle ausgeführt und der Rückgabewert angezeigt.

CONTROL

Vorgegebene Auswahl

Bsp. "Date"

Folgende Werte für Eingabearten sind verfügbar:

Liste = Combo Box (nur 4D 2003, in 2004 wie Feste Liste)

Feste Liste = Drop Down Menü die verfügbaren Einträge werden per VALUELIST übergeben (siehe Abschnitt VALUELIST)

Button =  Button der verschiedene Aktionen auslösen kann  (siehe Abschnitt ACTION)

Boolean = Check Box

Text = einfaches Textfeld, kann mehrzeilig sein (siehe Abschnitt ROWCOUNT)

Integer = Ganzzahl

Float = Kommazahl

Date = Datum

Time = Zeit

ReadOnly = nur Ausgabe, keine Eingabemöglichkeit

Erfolgt eine Eingabe in einem falschen Format wird die Zeile beim Bestätigen/Verlassen automatisch richtig formatiert.

 

Ganzzahl

Bsp. "3"

Legt die Höhe der angegebenen Zeile fest. Bei Textfeldern ist damit eine mehrzeilige Eingabe möglich.

ACTION

Vorgegebene Auswahl

Bsp. "Script"

Folgende Werte sind verfügbar:

Script = führt ein bestimmtes Script aus. Der Scriptname muss als Parameter in dir VALUELIST übergeben werden.

Selectionlist = öffnet ein Pop Up Fenster mit einer Auswahlliste. Die Werte der Auswahlliste müssen per  VALUELIST übergeben werden.

Multiselection =  öffnet ein Pop Up Fenster für eine Mehrfachauswahl. Die Werte für die Mehrfachauswahlliste sowie das Trennzeichen müssen per VALUELIST übergeben werden.

Die Aktion "Script" kann für die meisten Zeilentypen (Text, Datum, Zeit, usw.) verwendet werden. Scripte die an einen Button gebunden sind, werden durch Klick auf den Button oder durch Return gestartet. Scripte für ReadOnly Feldern werden beim Erzeugen der Tabelle und beim Betätigen von Return gestartet. Für alle anderen einfachen Felder werden die Scripte nach Datenänderung ausgeführt.

Die Script-Variable Param1 enthält die aktuelle Benutzereingabe. Soll diese Eingabe vom Script abgeändert werden, muss die Script-Variable Result mit dem gewünschten Rückgabewert gefüllt werden.

Die Aktionen "Selectionlist" und "Multiselection" können nur an Buttons gebunden werden.

VALUELIST

Scriptname oder Werteliste

Enthält den Scriptname für die Aktionen "Script" oder eine Liste von Werten für Combo Box, Drop Down Menü, Selectionlist oder Multiselection.

Als Trennzeichen für die einzelnen Werte der Werteliste ist ein Zeilenumbruch (Char 13), ein Semikolon oder ein Komma möglich. Bei Action "Multiselection" kann der API Funktion UserList noch ein 4. Parameter für das Trennzeichen im verknüpften Feld übergeben werden.

 

Die Definition der Tabelle geschieht mittels der API Schnittstellenfunktion UserList("Zeile";"Parameter";"Wert")

Beispiel:

Bei der Umstellung von der einfachen auf die erweiterte Namenseingabe in den Programmeinstellungen wird das Textfeld Name/Firma ausgeblendet und die Einzelfelder Name/Vorname/Firma1/Firma2/... eingeblendet. Um in bestehenden Kontakten das alte Namensfeld anzeigen zu lassen ist folgendes Script beim Öffnen von Kontakten auszuführen:

If (([Kontakte]Name#"") & ([Kontakte]Nachname="") & ([Kontakte]Vorname="") & ([Kontakte]Firma1="") & ([Kontakte]Firma2="") & ([Kontakte]Titel=""))

         UserList ("";"LINES";"1")

         UserList ("";"_WIDTH";"500")

         UserList ("";"_SPLIT";"15;35")            

         UserList ("1";"NAME";"ALT: Firma/Name")

         UserList ("1";"BIND";"[Kontakte]Name")

         UserList ("1";"CONTROL";"Text")

         UserList ("1";"ROWCOUNT";"5")

 End If

Kap_5_5_2_Bild_29.jpg

Die Definition der angezeigten Zeilen geschieht per Script beim Öffnen der Kontakte Detailansicht, was Sie in der Menü "Script - Scriptzuordnung" festlegen. Werden bei Öffnen keine Zeilen definiert oder ist das erforderliche Benutzerrecht (101130) nicht vorhanden wird das Steuerelement ausgeblendet und die Standardansicht wird verwendet.

Alte Kontakte werden nun wie im folgenden Screenshot angezeigt:

Kap_5_5_2_Bild_30.jpg

Individuelle Methoden und Formulare

Mit den individuellen Skripten können eigene Formulare und Funktionen programmiert werden.

Beispiel Code für Formulare:

 

Generic selection
Kopiere Code
ARRAY TEXT(aObjectType;12)
ARRAY TEXT(aObjectValue;12)
ARRAY LONGINT(aObjectPos;12;4)
ARRAY TEXT(aResults;0)
aObjectType{1}:="Groupbox"
aObjectValue{1}:="new entry form"
aObjectPos{1}{1}:=5  // left
aObjectPos{1}{2}:=3  // top
aObjectPos{1}{3}:=435  // right
aObjectPos{1}{4}:=100  // bottom
aObjectType{2}:="Label"
aObjectValue{2}:="Entry 1 Text / Check:"
aObjectPos{2}{1}:=15
aObjectPos{2}{2}:=25
aObjectPos{2}{3}:=140
aObjectPos{2}{4}:=40
aObjectType{3}:="Label"
aObjectValue{3}:="Entry 2 Dropdown:"
aObjectPos{3}{1}:=15
aObjectPos{3}{2}:=50
aObjectPos{3}{3}:=140
aObjectPos{3}{4}:=65
aObjectType{4}:="Label"
aObjectValue{4}:="Entry 3 Date / Icon:"
aObjectPos{4}{1}:=15
aObjectPos{4}{2}:=75
aObjectPos{4}{3}:=140
aObjectPos{4}{4}:=90

aObjectType{5}:="Text"  // Text
aObjectValue{5}:="9:20"
aObjectPos{5}{1}:=150
aObjectPos{5}{2}:=25
aObjectPos{5}{3}:=285
aObjectPos{5}{4}:=40
aObjectType{6}:="Dropdown"
aObjectValue{6}:="Value2;Value1;Value2;Value3"
aObjectPos{6}{1}:=150
aObjectPos{6}{2}:=48
aObjectPos{6}{3}:=285
aObjectPos{6}{4}:=66
aObjectType{7}:="Date"
aObjectValue{7}:="1.1.2013"
aObjectPos{7}{1}:=150
aObjectPos{7}{2}:=75
aObjectPos{7}{3}:=240
aObjectPos{7}{4}:=90

aObjectType{8}:="Checkbox"
aObjectValue{8}:="True"
aObjectPos{8}{1}:=300
aObjectPos{8}{2}:=25
aObjectPos{8}{3}:=425
aObjectPos{8}{4}:=40
aObjectType{9}:="Combobox"
aObjectValue{9}:="Value99;Value4;Value5;Value6"
aObjectPos{9}{1}:=300
aObjectPos{9}{2}:=48
aObjectPos{9}{3}:=425
aObjectPos{9}{4}:=66
aObjectType{10}:="Icon"
aObjectValue{10}:="25885"
aObjectPos{10}{1}:=300
aObjectPos{10}{2}:=70
aObjectPos{10}{3}:=324
aObjectPos{10}{4}:=94

aObjectType{11}:="OK"
aObjectValue{11}:="OK"
aObjectPos{11}{1}:=335
aObjectPos{11}{2}:=105
aObjectPos{11}{3}:=435
aObjectPos{11}{4}:=127
aObjectType{12}:="Abort"
aObjectValue{12}:="Cancel"
aObjectPos{12}{1}:=225
aObjectPos{12}{2}:=105
aObjectPos{12}{3}:=325
aObjectPos{12}{4}:=127
Generic_Selection (440;133;->aObjectType;->aObjectValue;->aObjectPos;->aResults)
If (OK=1)
My_Alert(aResults{6})
End if

 

Example codes for alerts and requests

Um eine Message box anzuzeigen:
Kopiere Code
My_ALERT ("Test")
My_ALERT2 ("Test1";"Test2";"Test3")
Bestätigungsdialog
Kopiere Code
My_CONFIRM ("Please confirm")
If (OK=1)
My_ALERT ("confirmed")
End if
Werteabfrage
Kopiere Code
vText:=My_REQUEST ("Please insert value")
If (OK=1)
My_ALERT (vText)
End if
Auswahlabfrage
Kopiere Code
vNum:=My_Choice ("Alternative 1";"Alternative 2")
Case of
: (OK=0)
// Cancel
: (vNum=1)
My_ALERT ("You have chosen Alternativ 1")
: (vNum=0)
My_ALERT ("You have chosen Alternative 2")
End case
Auswahlliste
Kopiere Code
ARRAY TEXT(cbodynamiccbo;3)
cbodynamiccbo{1}:="Value 1"
cbodynamiccbo{2}:="Value 2"
cbodynamiccbo{3}:="Value 3"
cbodynamiccbo:=2
vText:=My_CBO ("Please choose")
If (OK=1)
My_ALERT (vText)
End if

Beispiel Code für Datumswahl:

Default Datum wird auf aktuelles Datum gesetzt
Kopiere Code
cwSelectDate:=Current date(*)
CW_SetPrefs
CW_SetDate (cwSelectDate)
CW_OpenDialog
If (OK=1)
My_ALERT ("Date is "+String(cwSelectDate))
End if
Default Datum wird auf Monatsersten gesetzt
Kopiere Code
cwSelectDate:=date("01."+string(month of (current date(*)))+"."+string(year of (current date(*))))
CW_SetPrefs
CW_SetDate (cwSelectDate)
CW_OpenDialog
If (OK=1)
My_ALERT ("date is "+String(cwSelectDate))
End if
Default Datum ist immer aktuelles Datum
Kopiere Code
CW_SetPrefs
CW_SetDate
CW_OpenDialog
If (OK=1)
My_ALERT ("date is "+String(cwSelectDate))
End if

 

Eine komplette Übersicht über interne 4D Befehle kann im 4D Documentation Center abgerufen werden:

http://doc.4d.com/4Dv12/4D/12.4/4D-Programmiersprache.100-976885.de.html